Xss从0到1&&Xss-labs[1-20]

Pass1 文本解析为 `HTML`

1
2
3
4
5
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>

直接输入即可弹窗,在这里我们输入的字符串直接被带入前端执行

注意到,若alert中的为字符串,则需要单引号或双引号进行包裹,单数字则不需要

Pass2 `input` 标签 `value` 注入

来到第二关可以发现前端原样输出了我们输入的内容,但是没有执行相应的js代码,这是因为<> 被转义成了 &lt;&gt;导致的,但我们发现下面的

<input name=keyword value="<Script>alert(1)</Script>">

我们手动进行尝试闭合,在payload前面加上">即可

<input name=keyword value=""><Script>alert(1)</Script>">

Pass3 `htmlspecialchars()` 的弱点

**本题要求 PHP 版本低于 8.1.0。在 8.1.0 版本中此漏洞已经修复。**

HTML 标准规定了一个叫做实体(Entity)的概念。在 HTML 中,<h1> 会被解释为标题标签,那我们如何以文本形式显示出 <h1> 这四个字符呢?答案是使用字符实体,将 <&lt; 替代,将 >&gt; 替代。在 HTML 中,如果我们写 &lt;h1&gt;,就会显示为 <h1> 而不会被解析。

在 PHP 中,后端需要渲染出一个 HTML 给前端,对传来的字符串就要进行这样的处理,将 < 这样的字符转换为 &lt; 这样的实体。Level 1 就是没有进行这种处理的下场。

一个通常的做法就是:使用 PHP 自带的 htmlspecialchars() 函数处理字符串,进行字符转义。具体用法可以参考官方文档

在 8.1.0 及以上的 PHP 版本中,这个函数默认会转义 <>&'" 这五个字符,基本可以防范这里的 XSS 攻击。
但是,8.1.0 以下版本的 PHP 默认只会转义 <>&" 这四个字符,不会转义单引号 '。这就给这个函数带来了巨大的安全隐患。

回到这题,我们仍然尝试 <script>alert(1)</script>,打开页面源码,观察这个 input 输入框(上面是无法进行闭合了)

<input name=keyword value='&lt;script&gt;alert(1)&lt;/script&gt;'>

既然<> 会被转义,那么如何去不使用<script> </script>,就是利用加载器如 onmouseover

onmouseover 当鼠标移动到输入框上时,会触发 onmouseover

最终的payload:' onmouseover=alert(1) ' 首尾的’都需要有空格以保证html输出正常

或者是' onmouseover=javascript:alert(1) '

Pass4 没有过滤单双引号

1
2
3
<input name=keyword  value="scriptalert(1)/script"> 
<input name=keyword value="scriptalert('XSS')/script">
<input name=keyword value="scriptalert('XSS')/script">

疑似是黑名单过滤了 < > 那么用pass3的payload即可,注意改为双引号闭合

" onmouseover=javascript:alert(1) "

Pass5&6 href 的危险

1
2
<input name=keyword  value="<scr_ipt>alert(1)</script>">
<input name=keyword value="" o_nmouseover=javascript:alert(1) "">

发现<script>onmouseover都被过滤了

那么利用href构造payload

payload"> <a href=javascript:alert(1)>hack</a>

点击hack即可弹窗

Pass6和5相似,href 被替换为 hr_ef,事实上,这题使用了很蠢的字符过滤:区分大小写地搜索敏感词。而 HTML 并不区分大小写。所以将 href 写为 hREF 之类的即可。

payload "> <a Href=javascript:alert(1)>hack</a>

Xss备忘录

1
2
3
4
<Script>alert('Xss漏洞存在')</Script>
<Script>alert(1)</Script>

<script> function showAlert() { alert("无限弹框!"); } setInterval(showAlert, 10); // 每隔0.01秒弹一次 </script>

参考资料

[https://skywt.cn/blog/xss-labs-tutorial/](https://skywt.cn/blog/xss-labs-tutorial/)